0%

Observable 和 Subject 的区别

根据rxjs官网的说法,Observable是冷数据流,Subject是热数据流。

我的理解,从数据生成角度

  • Observable: 数据生成者,数据产生在内部
  • Subject:数据生成者和消费者,可以从外部接收数据

举个例子

1
2
3
4
5
6
7
8
9
import { Observable, Subject } from 'rxjs'

const observe$ = Observable.of(1, 2)
observe$.subscribe((a) => { console.log(a) }) // 1, 2

const subject = new Subject()
subject.subscribe((a) => { console.log(a) }) // 1, 2
subject.next(1)
subject.next(2)

从数据实时性角度

  • Observable:所有订阅,都可以获取到完全(任意时间,包含订阅前产生的)的数据流(冷)。
  • Subject:只能获取到订阅后产生的数据流,即实时数据(热)。

举个例子(还是上面那个,改),能说明问题

1
2
3
4
5
6
7
8
9
10
11
import { Observable, Subject } from 'rxjs'

const observe$ = Observable.of(1, 2)
setTimeout(() => {
observe$.subscribe((a) => { console.log(a) }) // 一秒后订阅仍然输出 1, 2
}, 1000)

const subject = new Subject()
subject.next(1)
subject.next(2)
subject.subscribe((a) => { console.log(a) }) // 无输出

这两者合理的组合用法

1
2
3
4
5
6
7
// 为了使两个观察者 observer1 和 observer2 “共享” tick$,
// 我们可以通过 Subject 来传输所有通知,像这样
const tick$ = Observable.interval(1000);
const subject = new Subject();
subject.subscribe(observer1);
subject.subscribe(observer2);
tick$.subscribe(subject);